package com.zxk.service.impl;

import com.sun.jna.platform.win32.WinDef;
import com.zxk.constant.JNAConstants;
import com.zxk.constant.PicConstants;
import com.zxk.enums.Coord;
import com.zxk.service.AbstractMyTask;
import com.zxk.util.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 抓鬼任务
 *
 * @author: 舟小亢
 * @date: 2023-08-27 18:45
 */
public class FightGhostTaskImpl extends AbstractMyTask {

    private static Logger LOG = LoggerFactory.getLogger(FightGhostTaskImpl.class);


    public FightGhostTaskImpl(WinDef.HWND hwnd_0, WinDef.HWND hwnd_1, WinDef.HWND hwnd_2) {
        super(hwnd_0, hwnd_1, hwnd_2);
    }

    @Override
    public String getTaskName() throws Exception {
        return "抓鬼";
    }

    @Override
    public boolean execute() throws Exception {
        LOG.warn("【抓鬼任务】开始！");

        // 切换组合1
        if (!changeAssistantTeam(Coord.ASSISTANT_FRIEND_1)) {
            LOG.info("【抓鬼任务】切换助战组合[1]失败！");
        }
        LOG.info("【抓鬼任务】切换助战组合[1]成功！");

        for (int i = 0; i < 99999; i++) {
            // 1 重新开始，初始化状态
            if (i != 0) {
                goHome();
            }

            // 2 领取点数
            if (!receivePoint()) {
                continue;
            }

            // 3 组队
            if (!createTeam()) {
                continue;
            }

            // 4 接受任务
            if (!acceptTask()) {
                continue;
            }

            // 5 循环判断任务是否完毕（包括异常中断）
            while (true) {
                ThreadUtil.sleep(15000);
                LOG.info("【抓鬼任务】判断{}轮是否结束", i + 1);
                pic = FuzzyPicUtil.findPic(hwnd_0, PicConstants.公共_活动, 3);
                if (pic.isFinded()) {
                    // 双重查找,保证准确找到
                    ThreadUtil.sleep(15000);
                    pic = FuzzyPicUtil.findPic(hwnd_0, PicConstants.公共_活动, 1);
                    if (pic.isFinded()) {
                        LOG.info("【抓鬼任务】第{}轮已结束", i + 1);
                        break;
                    }
                }
                if (FuzzyPicUtil.findPic(hwnd_0, PicConstants.公共_战斗中, 3).isFinded()) {
                    LOG.info("【抓鬼任务】战斗中,继续休眠!");
                    continue;
                }
                KeyUtil.kClick(hwnd_1, JNAConstants.VK_ESCAPE);
            }
        }
        return true;
    }

    private boolean receivePoint() throws Exception {
        if (!FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.公共_挂机, 3)) {
            return false;
        }
        for (int j = 0; j < 5; j++) {
            FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.抓鬼任务_领取点数, 1);
        }
        // 如果点数不够，点击取消
        FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.抓鬼任务_领取点数取消, 3);
        // 退出界面
        KeyUtil.kClick(hwnd_1, JNAConstants.VK_ESCAPE);
        if (!FuzzyPicUtil.findPic(hwnd_0, PicConstants.公共_活动, 3).isFinded()) {
            return false;
        }
        return true;
    }


    private boolean createTeam() throws Exception {
        // 进入队伍界面（双击进入）
        if (!FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.公共_队伍)) {
            return false;
        }

        // 再找一次队伍，有队伍的情况需要点2次
        FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.公共_队伍, 3);

        // 检查创建队伍/退出队伍
        pic = FuzzyPicUtil.findPicM(hwnd_1, new String[]{PicConstants.抓鬼队伍_创建队伍, PicConstants.抓鬼队伍_退出队伍}, 5);
        if (pic.getFindResult()[0] == 1) {
            // 未创建队伍，自动匹配，开始任务
            if (!taskReady()) {
                return false;
            }
        }
        if (pic.getFindResult()[1] == 1) {
            // 已经有队伍,判断位置2、3是否同时有人
            if (!PixelPicUtil.findPic(hwnd_1, PicConstants.抓鬼队伍_位置2, 3).isFinded() ||
                    !PixelPicUtil.findPic(hwnd_1, PicConstants.抓鬼队伍_位置3, 3).isFinded()) {
                // 有一个没找到，则退出队伍，重新创建并自动匹配
                // 先退出队伍
                if (!FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.抓鬼队伍_退出队伍)) {
                    return false;
                }

                // 重新创建
                if (!taskReady()) {
                    return false;
                }
            } else {
                ThreadUtil.sleep1();
                KeyUtil.kClick(hwnd_1, JNAConstants.VK_ESCAPE);
                LOG.warn("【抓鬼任务】队友已存在,开始任务!");
            }
        }

        // 切换到任务
        FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.公共_任务, 3, 0.7);

        return true;
    }

    private boolean taskReady() throws Exception {
        // 创建队伍
        if (!FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.抓鬼队伍_创建队伍)) {
            return false;
        }

        // 选择任务目标
        if (!FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.抓鬼队伍_选择任务)) {
            return false;
        }

        // 选择任务目标
        if (!FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.抓鬼队伍_日常任务)) {
            return false;
        }

        // 选择捉鬼任务
        if (!FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.抓鬼队伍_目标捉鬼)) {
            return false;
        }

        // 确认自动匹配
        if (!FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.抓鬼队伍_目标确定)) {
            return false;
        }

        // 循环查找直到2、3位置都有人
        for (int i = 0; i < 300; i++) {
            // 3秒确认一次
            ThreadUtil.sleep3();
            if (PixelPicUtil.findPic(hwnd_1, PicConstants.抓鬼队伍_位置2, 3).isFinded() &&
                    PixelPicUtil.findPic(hwnd_1, PicConstants.抓鬼队伍_位置3, 3).isFinded()) {
                // 匹配到人后，退出队伍界面，开始任务
                ThreadUtil.sleep1();
                KeyUtil.kClick(hwnd_1, JNAConstants.VK_ESCAPE);
                LOG.warn("【抓鬼任务】匹配到队友,开始任务!");
                return true;
            }
        }
        LOG.warn("【抓鬼任务】未匹配到队友,重新匹配");
        return false;
    }

    private boolean acceptTask() throws Exception {
        // 点击当前地图
        MouseUtil.lClickRandom(hwnd_1, Coord.CURRENT_MAP_XY.getX(), Coord.CURRENT_MAP_XY.getY());

        // 点击钟馗
        ThreadUtil.sleep(1500);
        MouseUtil.lClickRandom(hwnd_1,Coord.ZHONG_KUI_XY.getX(),Coord.ZHONG_KUI_XY.getY());

        // 查找查询次数
        pic = FuzzyPicUtil.findPic(hwnd_0, PicConstants.抓鬼任务_查询次数, 5);
        if (!pic.isFinded()) {
            return false;
        }
        // 查找5次捉鬼任务
        if (FuzzyPicUtil.findPic(hwnd_0, PicConstants.抓鬼任务_捉鬼任务, 5).isFinded()) {
            // 查找到就点击接受任务
            FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.抓鬼任务_捉鬼任务);
            // 查找5次取消找到就点击
            FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.抓鬼任务_取消, 5);
        }

        // 点击钟馗大图，防止干扰任务列表
        FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.抓鬼任务_钟馗大图, 5);

        // 滚动一次任务栏
        MouseUtil.dragMove(hwnd_1, Coord.TASK_LIST_WHELL.getX(), Coord.TASK_LIST_WHELL.getY(), 0, 1000);

        // 如果任务栏列表找到，则直接点击抓鬼任务开始
        if (FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.抓鬼任务_任务开始, 3)) {
            // 双重点击，提高成功率
            FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.抓鬼任务_任务开始, 3);
            return true;
        }

        // 先点一次任务栏(解决按键不释放的bug)
        FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.公共_任务, 3);
        // 否则去任务中，找到抓鬼任务,点击并开始
        if (!FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.公共_主线剧情, 3)) {
            if (!FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.公共_任务, 3)) {
                return false;
            }
            if (!FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.公共_主线剧情, 3)) {
                return false;
            }
        }
        if (!FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.公共_常规任务, 3)) {
            return false;
        }
        if (!FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.抓鬼任务_常规任务_抓鬼任务, 3)) {
            return false;
        }
        if (!FuzzyPicUtil.findAndClickRandom(hwnd_0, hwnd_1, PicConstants.公共_马上传送, 3)) {
            return false;
        }
        // 摁一次取消任务界面
        KeyUtil.kClick(hwnd_1, JNAConstants.VK_ESCAPE);
        return true;
    }


    @Override
    public boolean checkTask() {
        return true;
    }
}
